<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>异常处理</title>
</head>

<body>
    <p>
        JavaScript 提供了异常捕获和处理机制，帮助开发者处理代码执行中的错误。
        通过 throw、Error 对象、try...catch、finally等关键字，可以捕获、处
        理和抛出错误，以确保应用程序的稳定性和可靠性。以下是详细的说明及应用场景，
        随后会提供三个符合实际场景的完整示例代码。</p>

    <p>throw 关键字<br>

        - 作用：throw 用于抛出一个异常。当代码执行到 throw 语句时，程序会立即停止执行，
        并将控制权交给最近的 try...catch 块（如果存在）。<br>
        - 使用场景：在代码中检测到不符合预期的条件或错误时使用 throw 抛出一个异常，
        让调用者处理错误。
    </p>
    <p>
        Error 对象<br>

        - 作用：Error 是 JavaScript 内置的一个对象，用于创建描述错误的对象。
        Error 对象可以包含错误信息（通过 message 属性）和调用栈信息（通过 stack 属性）。<br>
        - 使用场景：当你需要抛出一个结构化的错误信息时，使用 Error 对象。
    </p>
    <p>
        try...catch 语句<br>

        - 作用：try 块中包含可能会抛出异常的代码。如果 try 块中的代码抛出了异常，
        控制权将转移到相应的 catch 块，并执行 catch 中的代码。<br>
        - 使用场景：在有可能发生错误的代码周围使用 try...catch，以防止程序崩溃，
        并处理错误或记录错误日志。
    </p>

    <p>
        finally 块<br>
        - 作用：finally 块中的代码无论是否发生异常都会执行。通常用于执行清理操作，
        如关闭文件、释放资源等。<br>
        - 使用场景：在需要确保某些代码（如清理代码）始终执行的情况下使用 finally 块。
    </p>
    <p>
        应用场景: <br>

        - 输入验证：当用户输入的数据格式不正确时抛出异常，并在 catch 中处理。<br>
        - 文件操作：当读取或写入文件时发生错误，使用 try...catch 捕获错误，并在 finally 中关闭文件。<br>
        - 网络请求：在进行网络请求时，如果请求失败或返回错误状态码，抛出异常并处理。

    </p>


    <script>
        // 示例 1：处理用户输入的异常
        // function valiDataAge(age) {
        //     if (typeof age !== 'number' || age <= 0) {
        //         throw new Error("Invalid age provided 提供的无效年龄");
        //     }
        //     return true
        // }

        // try {
        //     let age = parseInt(prompt('Enter your age 输入你的年龄：'));
        //     valiDataAge(age);
        //     console.log('Age is valid 年龄是有效的');

        // } catch (error) {
        //     console.error('Error:', error.message);

        // } finally {
        //     console.log('Age validation complete 年龄验证完成');

        // }
        // 场景：这个示例中，用户输入的年龄需要进行验证。如果输入无效，
        // 抛出异常并在 catch 块中处理。finally 块中的代码确保无论输入是否有效，都会执行。


        // 示例 2：处理文件操作中的异常
        // function readFile(filePath) {
        //     let file;
        //     try {
        //         file = openFile(filePath);
        //         let content = file.read();
        //         console.log('File content 文件内容：', content);

        //     } catch (error) {
        //         console.error('Error reading flie 读取文件错误:', error.message);

        //     } finally {
        //         if (file) {
        //             // file.close(); // 确保文件总是关闭的
        //         }
        //     }
        // }
        // readFile('03.js')


        // 示例 3：处理网络请求中的异常
        async function fetchData(url) {
            try {
                let resopnse = await fetch(url);
                if (!resopnse.ok) {
                    throw new Error("Network response was not ok 网络响应不正常");
                }
                let data = await resopnse.json();
                console.log('Data received 接收到的数据:', data);

            } catch (error) {
                console.error('Fetch error 获取错误 :', error.message);

            } finally {
                console.log('Fetch Fetch 获取操作完成');

            }
        }
        fetchData('') // 放一个网址



    </script>

</body>

</html>